const express = require('express')
const router = express.Router()
const multer = require('multer')//用于上传图片
const Img = require('../db/models/imgModel')
const moment = require('moment')
// 生成路由实例
const fs = require("fs")

// 初始化上传图片对象upload
let upload = multer({
    // limits:{// 限制设置
    //     //限制文件大小1MB
    //     fileSize: 1024*1024,
    //     //限制文件数量
    //     files: 1
    // },
    storage: multer.diskStorage({//存储文件相关设置
        // 设置上传文件路径
        destination: function (req,file,cb){
            cb(null,'./static/uploads')
        },
        // 设置上传文件名称
        filename: function (req,file,cb){
            // console.log( file )//上传的文件对象
            // {
            //     fieldname: 'hehe',
            //     originalname: '3.png',
            //     encoding: '7bit',
            //     mimetype: 'image/png'
            //   }
            // 文件名：'IMG-' + '时间戳' + '文件后缀'
            let tempname = 'IMG'+Date.now()+'.'+file.mimetype.split('/')[1]
            cb(null,tempname)
        }
    }),
    fileFilter: function (req,file,cb){// 过滤上传的文件
        // console.log( file )
        // {
        //     fieldname: 'hehe',
        //     originalname: '3-asdf.png',
        //     encoding: '7bit',
        //     mimetype: 'image/png'
        //   }
        let types = ['png','jpg','gif','jpeg','webp','svg']//允许上传文件格式列表
        let arr = file.originalname.split('.')
        let flag = arr[arr.length-1]//图片后缀名
        if (types.includes(flag)) {
            cb(null,true)// 接收文件
        } else {
            cb(null,false)// 拒收文件
        }
    }
})

// 生成上传图片的方法（单例）上传图片的 filed 为："image"
// 这个东西很重要
let doSomeThing = upload.single('image')

// 上传图片 （只能用post）
/**
 * @api {post} /file/upload 上传图片
 * @apiGroup file
 *
 * @apiParam {String} anull 无需参数
 *
 * @apiSuccessExample 返回数据示例:
 * {
 *     "err": 0,
 *     "msg": "上传成功",
 *     "imgurl": './uploads/upload-16936743748.png'
 * }
 */
router.post('/upload',(req,res)=>{
    // console.log(req.file) // undefiend
    doSomeThing(req,res,(err)=>{//上传完成
        // console.log('错误信息',err)
        // 问题从这里解决的：node multer 报错Unexpected field
        // upload.single的参数 fileid是和from表单中input输入框的name属性的值保持一致
        // {
        //     fieldname: 'hehe',
        //     originalname: 'api.png',
        //     encoding: '7bit',
        //     mimetype: 'image/png',
        //     destination: './public/uploads',
        //     filename: 'upload-1619078828902.png',
        //     path: 'public\\uploads\\upload-1619078828902.png',
        //     size: 228
        //   }
        // 前端引用图片格式： http://localhost:3003/static/uploads/IMG-1620816798980.jpeg
        if (err) {//有错时，说明上传文件不符合限制要求
            return res.send({err:-1,msg:'上传图片不能大于1MB',data:'错误'})
        }
        if (!req.file) {//文件被拒收时，为 req.file = undefine
            return res.send({err:-2,msg:'只能上传图片！'})
        }

        // 上传图片成功 req.file = {。。。}
        let url = '/uploads/'+req.file.filename
        let time = moment().format("YYYY-MM-DD");
        Img.insertMany({imgurl:url,time:time})
        .then(()=>{
           res.send({err:0,msg:'图片数据录入成功',imgurl:url,data:'成功'})
        })
        .catch((err)=>{
            if(err){
                res.send({err:-4,msg:'执行出现异常'})
            }
        })
        
    })
})

// 删除图片 
/**
 * @api {post} /file/del 删除
 * @apiGroup file
 *
 * @apiParam {String} imgurl 图片地址
 *
 * @apiSuccessExample 返回数据示例:
 * {
 *     "err": 0,
 *     "msg": "删除成功"
 * }
 */
router.post('/del',(req,res)=>{
    let {imgurl} = req.body
    if(!imgurl){
        return res.send({msg:"imgurl为空"})
    }
    Img.find({imgurl:imgurl})
    .then((data)=>{
        if(data.length>0){
            return Img.deleteOne({imgurl:imgurl})
        }else{
            res.send({err:4,msg:'数据库无此图片'})
        }
    }).then((ret)=>{ //数据库删除操作成功
        // console.log("数据库记录删除成功")
        // res.send({err:0,msg:'数据库图片地址删除成功'})
        fs.unlink('./static'+imgurl,(err)=>{
            if(err){
                res.send({err:-2,msg:'本地图片删除失败',info:err,imgurl})
                return false;
            }else{
                res.send({err:0,msg:'删除成功'})
            }
        })
    }).catch((err)=>{
        res.send({err:-5,msg:'执行出错'})
    })
})

// 获取所有图片
/**
 * @api {get} /file/getImg 获取所有图片
 * @apiGroup file

 *
 * @apiSuccessExample 返回数据示例:
 * {
 *     "err": 0,
 *     "msg": "删除成功"
 *     "data":[
 *          {url:"xxxxx.jpg",time:'2021-04-05'},
 *          {url:"xxxxx.jpg",time:'2021-04-05'},
 *          {url:"xxxxx.jpg",time:'2021-04-05'},
 *     ]
 * }
 */
 router.get('/getImg',(req,res)=>{
   
    Img.find()
    .then((data)=>{
        if (data.length > 0) {
            res.send({err:0,msg:'查询成功',data:data})
        } else {
            res.send({err:-1,msg:'暂无数据',data:[]})
        }
    })
    .catch((err)=>{
        res.send({err:-2,msg:'查询失败'})
    })
})

module.exports = router